package bevtreestatus

import (
	"sync/atomic"
	"time"
)

/*
	临时ID组成部分

	20位的 srvID
	12位的 startID
	32位的 seed

	|-- srvID 16位 --|-- startID 16位 --|-- seed 32位 --|
	XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
*/

var iDFetcherEx = newIDFetcher(0)

// IDFetcher 获取唯一的TempID号
type IDFetcher struct {
	baseID uint64
	seed   uint64
}

func newIDFetcher(srvID uint64) *IDFetcher {
	result := new(IDFetcher)
	result.baseID = srvID
	result.seed = uint64(time.Now().Unix()) << 16
	return result
}

// FetchTempID 获取一个唯一ID (在服务器重启的时候，这个ID唯一的变量就是starID,之前它的上限是32，以为这当服务器非正常关闭32次就有可能出现重复ID
//我觉得这里有些危险，现扩容至 2 ^ 12，降低重复风险)(这里是临时ID，重复有啥问题吗！！！！！，就算服务器crash了，临时ID重新生成有什么问题吗！！！！)(真的有...
// 玩家的路由信息，使用这个ID作为key，玩家下线在上，id有可能重复)

//改成与IDGenerater一样的算法了
func (srv *IDFetcher) FetchTempID() uint64 {
	seed := atomic.AddUint64(&srv.seed, 1)
	high := seed << 16 >> 16
	tmptime := seed >> 16
	for n := int64(tmptime - uint64(time.Now().Unix())); n > 0; n = int64(tmptime - uint64(time.Now().Unix())) {
		time.Sleep(time.Duration(n-1)*time.Second + time.Millisecond*100)
	}
	result := srv.baseID<<48 | high
	return result
}
